package thefirst.controller;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import thefirst.member.model.AdminService;
import thefirst.member.model.AdminVO;
import thefirst.support.model.HelpService;
import thefirst.support.model.HelpVO;
import thefirst.support.model.NoticeService;
import thefirst.support.model.NoticeVO;

@Controller
public class AdminController {
	private String path="C:\\java-kosta\\workspace\\project-thrfirst\\whereismyteacher-b0.01\\WebContent\\upload\\";
	@Resource(name="adminServiceImpl")
	private AdminService adminService;
	@Resource(name="noticeServiceImpl")
	private NoticeService noticeService;
	@Resource(name="helpServiceImpl")
	private HelpService helpService;
	/**
	 * 관리자 로그인
	 * @param avo
	 * @param session
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/loginForAdmin.do")
	public ModelAndView loginForAdmin(AdminVO avo,HttpSession session) throws SQLException{
		AdminVO adminVO=adminService.loginForAdmin(avo);
		session.setAttribute("admin", adminVO);
		return new ModelAndView("admin");
	}
	/**
	 * 관리자 로그아웃
	 * @param session
	 * @return
	 */
	@RequestMapping("/logoutForAdmin.do")
	public ModelAndView logout(HttpSession session) {
		if (session != null) {
			session.invalidate();
		}
		return new ModelAndView("admin");
	}
	/**
	 * 관리자를 위한 공지사항 리스트
	 * @param pageNo
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/noticeListForAdmin.do")
	public ModelAndView noticeListForAdmin(String pageNo) throws Exception{
		return new ModelAndView("admin/notice/noticeList.admin","list",noticeService.getNoticeList(pageNo));
	}
	/**
	 * 글쓰기 페이지로 이동
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/writeNoticePageForAdmin.do")
	public String writeNoticePageForAdmin(HttpServletRequest request,HttpServletResponse response) throws Exception{
		return "admin/notice/writeNoticePage.admin";
	}
	/**
	 * 공지사항 목록에서 글보기 페이지로 이동
	 * 조회수 증가 - 서비스에서 처리
	 * @param no
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/showNoticeInfoForAdmin.do")
	public ModelAndView showNoticeInfo(int no) throws SQLException{
		System.out.println("showNoticeInfo:"+no);
		NoticeVO nvo=noticeService.showNoticeInfo(no);
		System.out.println("showNoticeInfo:"+nvo);
		return new ModelAndView("admin/notice/showNoticeInfo.admin","nvo",nvo);
	}
	/**
	 * 공지사항 업데이트 페이지로 이동
	 * no로 글의 정보를 가져온다.
	 * @param no
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/updateNoticePageForAdmin.do")
	public ModelAndView updatePageForAdmin(int no) throws Exception{
		return new ModelAndView("admin/notice/updateNoticePage.admin","nvo",noticeService.showNoticeInfoNoHits(no));
	}
	/**
	 * 공지사항 글 수정
	 * 글 수정할 때 파일 업로드도 수정할 수 있어야 한다.
	 * @param nvo
	 * @return
	 * @throws SQLException
	 * @throws IOException 
	 * @throws IllegalStateException 
	 */
	@RequestMapping("/updateNoticeForAdmin.do")
	public ModelAndView updateNoticeForAdmin(NoticeVO nvo) throws SQLException, IllegalStateException, IOException{
		System.out.println("update notice controller:"+nvo);
		MultipartFile mFile=nvo.getUploadFile();
		//파일의 존재 유뮤를 파악한다.
		if(mFile!=null&&mFile.isEmpty()==false){
			nvo.setOrgFileName(mFile.getOriginalFilename());
			System.out.println("update notice controller orgfilename"+nvo.getOrgFileName());
			String uploadName=System.currentTimeMillis()+"_"+nvo.getOrgFileName();
			nvo.setSavFileName(uploadName);
			System.out.println("update notice controller savfilename"+nvo.getSavFileName());
			File copyFile=new File(path+uploadName);
			mFile.transferTo(copyFile);
		}
		int result=noticeService.updateNotice(nvo);
		System.out.println("update notice controller result:"+result);
		String mess="admin/notice/showNoticeInfo.admin";
		if(result==0){
			mess="/WEB-INF/error";
		}
		return new ModelAndView(mess,"nvo",noticeService.showNoticeInfoNoHits(nvo.getNo()));
	}
	/**
	 * 공지사항 쓰기
	 * 파일을 업로드 할 수 있도록 DB에 파일이름 저장
	 * 파일을 해당 폴더로 이동시킨다.
	 * 새로고침을 막기위해 redirect
	 * @param request
	 * @param nvo
	 * @return
	 * @throws SQLException
	 * @throws IOException 
	 * @throws IllegalStateException 
	 */
	@RequestMapping("/writeNoticeForAdmin.do")
	public ModelAndView writeNoticeForAdmin(NoticeVO nvo) throws SQLException, IllegalStateException, IOException{
		System.out.println("controller:"+nvo);
		MultipartFile mFile=nvo.getUploadFile();
		//파일의 유무 확인
		if(mFile!=null&&mFile.isEmpty()==false){
			nvo.setOrgFileName(mFile.getOriginalFilename());//파일 이름을 orgFileName에 세팅
			String uploadName=System.currentTimeMillis()+"_"+nvo.getOrgFileName();
			nvo.setSavFileName(uploadName);//저장된 파일 이름을 세팅 (시간+orgFileName)
			File copyFile=new File(path+uploadName);//path위치에 파일 생성
			mFile.transferTo(copyFile);//이동
		}
		noticeService.writeNotice(nvo);
		return new ModelAndView("redirect:/showNoticeInfoNoHitsForAdmin.do?no="+nvo.getNo());
	}
	/**
	 * 조회수가 올라가지 않고 공지사항 정보 가져오는 메서드
	 * @param no
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/showNoticeInfoNoHitsForAdmin.do")
	public ModelAndView showNoticeInfoNoHitsForAdmin(int no) throws SQLException{
		return new ModelAndView("admin/notice/showNoticeInfo.admin","nvo",noticeService.showNoticeInfoNoHits(no));
	}
	/**
	 * 공지사항 글 삭제
	 * 조건 : 파일이 존재할 경우 삭제
	 * @param no
	 * @param pageNo
	 * @return
	 * @throws Exception 
	 */
	@RequestMapping("/deleteNoticeForAdmin.do")
	public ModelAndView deleteNoticeForAdmin(int no) throws Exception{
		NoticeVO nvo=noticeService.showNoticeInfoNoHits(no);
		System.out.println("delete:"+nvo);
		String uploadFile=nvo.getSavFileName();
		//파일이 존재한다면 일단 해당 파일을 삭제해야한다.
		if(uploadFile!=null){
			noticeService.deleteFile(path+uploadFile);
		}
		//DB에서 삭제
		noticeService.deleteNotice(no);
		return new ModelAndView("admin/notice/noticeList.admin","list",noticeService.getNoticeList("1"));
	}
	/**
	 * 파일 다운로드
	 * util.DownloadView에서 request.getParameter("savFileName") <- 값 확인
	 * @param savFileName
	 * @return
	 */
	@RequestMapping("/downloadNoticeFile.do")
	public ModelAndView downloadNoticeFile(String savFileName){
		System.out.println("savFileName:"+savFileName);
		HashMap map=new HashMap();
		map.put("path", path);
		//downloadView를 java bean에 설정하고 이용
		return new ModelAndView("downloadView",map);
	}
	/**
	 * ajax - ResponseBody
	 * 공지사항의 파일을 삭제하는 메서드
	 * DB에 저장된 값들도 삭제한다.(orgFileName,savFileName)
	 * @param no
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/deleteFileForUpdate.do")
	@ResponseBody
	public int deleteFileForUpdate(int no) throws Exception{
		System.out.println("json:"+no);
		NoticeVO nvo=noticeService.showNoticeInfoNoHits(no);
		String uploadFile=nvo.getSavFileName();
		if(uploadFile!=null||!uploadFile.equals("")){
			noticeService.deleteFile(path+uploadFile);
		}
		int result=noticeService.updateNoticeNoFile(no);
		System.out.println("delete:"+result);
		return result;
	}
////////////////////////문의하기////////////////////////
	/**
	 * 문의하기 글쓰기 페이지로 이동
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/writeHelpPageForAdmin.do")
	public String writeHelpPageForAdmin() throws Exception{
		return "admin/help/writeHelpPage.admin";
	}
	/**
	 * 문의하기 글쓰기 DB에 저장
	 * 새로고침을 막기 위해서 redirect
	 * @param request
	 * @param hvo
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/writeHelpForAdmin.do")
	public ModelAndView writeHelpForAdmin(HelpVO hvo) throws SQLException{
		helpService.writeHelp(hvo);
		return new ModelAndView("redirect:/showHelpInfoForAdmin.do?no="+hvo.getNo());
	}
	/**
	 * redirect로 보낸 no를 통해서 조회수를 올리지 않고 
	 * 글을 가져오는 메서드
	 * @param no
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/showHelpInfoNoHitsForAdmin.do")
	public ModelAndView showHelpInfoNoHits(int no) throws SQLException{
		return new ModelAndView("admin/help/showHelpInfo.admin","hvo",helpService.showHelpInfoNoHits(no));
	}
	/**
	 * 문의하기의 리스트 보여주기
	 * @param pageNo
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/helpListForAdmin.do")
	public ModelAndView getHelpListForAdmin(String pageNo) throws SQLException{
		System.out.println("문의하기 페이지:"+pageNo);
		return new ModelAndView("admin/help/helpList.admin","list",helpService.getHelpList(pageNo));
	}
	/**
	 * 리스트에서 제목 클릭
	 * 문의하기 글 상세보기
	 * @param no
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/showHelpInfoForAdmin.do")
	public ModelAndView showHelpInfoForAdmin(int no) throws SQLException{
		System.out.println("showHelpInfo:"+no);
		HelpVO hvo=helpService.showHelpInfo(no);
		System.out.println("showHelpInfo:"+hvo);
		return new ModelAndView("admin/help/showHelpInfo.admin","hvo",hvo);
	}
	/**
	 * 문의하기의 업데이트 페이지로 이동
	 * no로 글 정보를 가져온다.
	 * @param no
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/updateHelpPageForAdmin.do")
	public ModelAndView updateHelpPageForAdmin(int no) throws Exception{
		return new ModelAndView("admin/help/updateHelpPage.admin","hvo",helpService.showHelpInfoNoHits(no));
	}
	/**
	 * 문의하기 수정 내용을 업데이트 한다.
	 * @param hvo
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/updateHelpForAdmin.do")
	public ModelAndView updateHelpForAdmin(HelpVO hvo) throws SQLException{
		int result=helpService.updateHelp(hvo);
		String str="admin/help/showHelpInfo.admin";
		if(result==0){
			str="/WEB-INF/error";
		}
		return new ModelAndView(str,"hvo",helpService.showHelpInfoNoHits(hvo.getNo()));
	}
	/**
	 * 문의하기 삭제
	 * @param no
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/deleteHelpForAdmin.do")
	public ModelAndView deleteHelpForAdmin(int no) throws SQLException{
		helpService.deleteHelp(no);
		return new ModelAndView("admin/help/helpList.admin","list",helpService.getHelpList("1"));
	}
	/**
	 * 문의하기 댓글달기 페이지 이동
	 * @param no
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/writeHelpReplyPageForAdmin.do")
	public ModelAndView writeHelpReplyPageForAdmin(int no) throws SQLException{
		HelpVO hvo=helpService.showHelpInfoNoHits(no);
		return new ModelAndView("admin/help/writeHelpReplyPage.admin","hvo",hvo);
	}
	/**
	 * 문의하기 댓글달기 쓰기
	 * @param hvo
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/writeHelpReplyForAdmin.do")
	public ModelAndView writeHelpReplyForAdmin(HelpVO hvo) throws SQLException{
		helpService.writeHelpReply(hvo);
		return new ModelAndView("redirect:/showHelpInfoForAdmin.do?no="+hvo.getNo(),
				"hvo",helpService.showHelpInfoNoHits(hvo.getNo()));
	}	
}
